Add routines _gtk_find_module(), _gtk_get_module_path() to look up a
authorOwen Taylor <otaylor@redhat.com>
Tue, 19 Feb 2002 05:33:34 +0000 (05:33 +0000)
committerOwen Taylor <otaylor@src.gnome.org>
Tue, 19 Feb 2002 05:33:34 +0000 (05:33 +0000)
Mon Feb 18 23:16:16 2002  Owen Taylor  <otaylor@redhat.com>

        * gtk/gtkmain.[ch]: Add routines _gtk_find_module(),
        _gtk_get_module_path() to look up a module of an arbitrary type in
        a standard fashion. (#68474)

        * gtk/gtkrc.c: Make module_path keyword warn and do
        nothing. Remove the im_module_path keyword.

        * gtk/gtkrc.c (gtk_rc_get_im_module_path): Fix
        to return the standard path instead of one determined
        from im_module_path and GTK_IM_MODULE_PATH.

        * gtk+-2.0.pc.in: Add gtk_host to go along with gtk_binary_version.

15 files changed:
ChangeLog
ChangeLog.pre-2-0
ChangeLog.pre-2-10
ChangeLog.pre-2-2
ChangeLog.pre-2-4
ChangeLog.pre-2-6
ChangeLog.pre-2-8
docs/reference/ChangeLog
docs/reference/gtk/running.sgml
docs/reference/gtk/tmpl/gtkrc.sgml
gtk+-2.0.pc.in
gtk/Makefile.am
gtk/gtkmain.c
gtk/gtkmain.h
gtk/gtkrc.c

index e0118971c94dff9043b8e4a88485dee0f16894db..fdf2605464a699753a47573bf2112c9af39cc1a5 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,18 @@
+Mon Feb 18 23:16:16 2002  Owen Taylor  <otaylor@redhat.com>
+
+       * gtk/gtkmain.[ch]: Add routines _gtk_find_module(),
+       _gtk_get_module_path() to look up a module of an arbitrary type in
+       a standard fashion. (#68474)
+
+       * gtk/gtkrc.c: Make module_path keyword warn and do
+       nothing. Remove the im_module_path keyword.
+
+       * gtk/gtkrc.c (gtk_rc_get_im_module_path): Fix
+       to return the standard path instead of one determined
+       from im_module_path and GTK_IM_MODULE_PATH.
+       
+       * gtk+-2.0.pc.in: Add gtk_host to go along with gtk_binary_version.
+
 2002-02-19  Matthias Clasen  <maclas@gmx.de>
 
        * docs/tutorial/gtk-tut.sgml, docs/examples/*: Trivial formatting
index e0118971c94dff9043b8e4a88485dee0f16894db..fdf2605464a699753a47573bf2112c9af39cc1a5 100644 (file)
@@ -1,3 +1,18 @@
+Mon Feb 18 23:16:16 2002  Owen Taylor  <otaylor@redhat.com>
+
+       * gtk/gtkmain.[ch]: Add routines _gtk_find_module(),
+       _gtk_get_module_path() to look up a module of an arbitrary type in
+       a standard fashion. (#68474)
+
+       * gtk/gtkrc.c: Make module_path keyword warn and do
+       nothing. Remove the im_module_path keyword.
+
+       * gtk/gtkrc.c (gtk_rc_get_im_module_path): Fix
+       to return the standard path instead of one determined
+       from im_module_path and GTK_IM_MODULE_PATH.
+       
+       * gtk+-2.0.pc.in: Add gtk_host to go along with gtk_binary_version.
+
 2002-02-19  Matthias Clasen  <maclas@gmx.de>
 
        * docs/tutorial/gtk-tut.sgml, docs/examples/*: Trivial formatting
index e0118971c94dff9043b8e4a88485dee0f16894db..fdf2605464a699753a47573bf2112c9af39cc1a5 100644 (file)
@@ -1,3 +1,18 @@
+Mon Feb 18 23:16:16 2002  Owen Taylor  <otaylor@redhat.com>
+
+       * gtk/gtkmain.[ch]: Add routines _gtk_find_module(),
+       _gtk_get_module_path() to look up a module of an arbitrary type in
+       a standard fashion. (#68474)
+
+       * gtk/gtkrc.c: Make module_path keyword warn and do
+       nothing. Remove the im_module_path keyword.
+
+       * gtk/gtkrc.c (gtk_rc_get_im_module_path): Fix
+       to return the standard path instead of one determined
+       from im_module_path and GTK_IM_MODULE_PATH.
+       
+       * gtk+-2.0.pc.in: Add gtk_host to go along with gtk_binary_version.
+
 2002-02-19  Matthias Clasen  <maclas@gmx.de>
 
        * docs/tutorial/gtk-tut.sgml, docs/examples/*: Trivial formatting
index e0118971c94dff9043b8e4a88485dee0f16894db..fdf2605464a699753a47573bf2112c9af39cc1a5 100644 (file)
@@ -1,3 +1,18 @@
+Mon Feb 18 23:16:16 2002  Owen Taylor  <otaylor@redhat.com>
+
+       * gtk/gtkmain.[ch]: Add routines _gtk_find_module(),
+       _gtk_get_module_path() to look up a module of an arbitrary type in
+       a standard fashion. (#68474)
+
+       * gtk/gtkrc.c: Make module_path keyword warn and do
+       nothing. Remove the im_module_path keyword.
+
+       * gtk/gtkrc.c (gtk_rc_get_im_module_path): Fix
+       to return the standard path instead of one determined
+       from im_module_path and GTK_IM_MODULE_PATH.
+       
+       * gtk+-2.0.pc.in: Add gtk_host to go along with gtk_binary_version.
+
 2002-02-19  Matthias Clasen  <maclas@gmx.de>
 
        * docs/tutorial/gtk-tut.sgml, docs/examples/*: Trivial formatting
index e0118971c94dff9043b8e4a88485dee0f16894db..fdf2605464a699753a47573bf2112c9af39cc1a5 100644 (file)
@@ -1,3 +1,18 @@
+Mon Feb 18 23:16:16 2002  Owen Taylor  <otaylor@redhat.com>
+
+       * gtk/gtkmain.[ch]: Add routines _gtk_find_module(),
+       _gtk_get_module_path() to look up a module of an arbitrary type in
+       a standard fashion. (#68474)
+
+       * gtk/gtkrc.c: Make module_path keyword warn and do
+       nothing. Remove the im_module_path keyword.
+
+       * gtk/gtkrc.c (gtk_rc_get_im_module_path): Fix
+       to return the standard path instead of one determined
+       from im_module_path and GTK_IM_MODULE_PATH.
+       
+       * gtk+-2.0.pc.in: Add gtk_host to go along with gtk_binary_version.
+
 2002-02-19  Matthias Clasen  <maclas@gmx.de>
 
        * docs/tutorial/gtk-tut.sgml, docs/examples/*: Trivial formatting
index e0118971c94dff9043b8e4a88485dee0f16894db..fdf2605464a699753a47573bf2112c9af39cc1a5 100644 (file)
@@ -1,3 +1,18 @@
+Mon Feb 18 23:16:16 2002  Owen Taylor  <otaylor@redhat.com>
+
+       * gtk/gtkmain.[ch]: Add routines _gtk_find_module(),
+       _gtk_get_module_path() to look up a module of an arbitrary type in
+       a standard fashion. (#68474)
+
+       * gtk/gtkrc.c: Make module_path keyword warn and do
+       nothing. Remove the im_module_path keyword.
+
+       * gtk/gtkrc.c (gtk_rc_get_im_module_path): Fix
+       to return the standard path instead of one determined
+       from im_module_path and GTK_IM_MODULE_PATH.
+       
+       * gtk+-2.0.pc.in: Add gtk_host to go along with gtk_binary_version.
+
 2002-02-19  Matthias Clasen  <maclas@gmx.de>
 
        * docs/tutorial/gtk-tut.sgml, docs/examples/*: Trivial formatting
index e0118971c94dff9043b8e4a88485dee0f16894db..fdf2605464a699753a47573bf2112c9af39cc1a5 100644 (file)
@@ -1,3 +1,18 @@
+Mon Feb 18 23:16:16 2002  Owen Taylor  <otaylor@redhat.com>
+
+       * gtk/gtkmain.[ch]: Add routines _gtk_find_module(),
+       _gtk_get_module_path() to look up a module of an arbitrary type in
+       a standard fashion. (#68474)
+
+       * gtk/gtkrc.c: Make module_path keyword warn and do
+       nothing. Remove the im_module_path keyword.
+
+       * gtk/gtkrc.c (gtk_rc_get_im_module_path): Fix
+       to return the standard path instead of one determined
+       from im_module_path and GTK_IM_MODULE_PATH.
+       
+       * gtk+-2.0.pc.in: Add gtk_host to go along with gtk_binary_version.
+
 2002-02-19  Matthias Clasen  <maclas@gmx.de>
 
        * docs/tutorial/gtk-tut.sgml, docs/examples/*: Trivial formatting
index 13bc0125b38d3c7147f17be46eb8d36b1aaa7f57..0ae970070cfe012b331d7f1ae86fff05dcbcdfb5 100644 (file)
@@ -1,3 +1,8 @@
+Mon Feb 18 23:00:52 2002  Owen Taylor  <otaylor@redhat.com>
+
+       * gtk/running.sgml: Remove docs for GTK_IM_MODULE_PATH,
+       replace docs for GTK_MODULE_PATH with docs for GTK_PATH.
+
 Sun Feb 17 21:33:33 2002  Owen Taylor  <otaylor@redhat.com>
 
        * gtk/gtk-sections.txt: Updated for filesel changes.
index 53651735430feb1a1154c89dabbf09260dbac0c8..8b78fedd53d538efbb5074b9d02d6e2a17d97e71 100644 (file)
@@ -205,18 +205,42 @@ or <envar>DISPLAY</envar>; mostly to determine paths to look for certain files.
 </formalpara>
 
 <formalpara>
-  <title><envar>GTK_MODULE_PATH</envar></title>
+  <title><envar>GTK_PATH</envar></title>
 
   <para>
-    A list of directories to search for modules before the default module 
-    directory, which is <filename>&lt;libdir&gt;/gtk-2.0/modules</filename>.
-    (If <envar>GTK_EXE_PREFIX</envar> is defined, &lt;libdir&gt; is 
+    Specifies a list of directories to search when GTK+ is looking for
+    dynamically loaded objects such as the modules specified by
+    <envar>GTK_MODULES</envar>, theme engines, and input method
+    modules. If the path to the dynamically loaded object is given
+    as an absolute path name, then GTK+ loads it directly. Otherwise,
+    GTK+ goes in turn through the directories in GTK_PATH, followed
+    by the directory <filename>.gtk-2.0</filename> in the user's home
+    directory, followed by the system default directory, 
+    which is <filename><replaceable>libdir</replaceable>/gtk-2.0/modules</filename>.
+    (If <envar>GTK_EXE_PREFIX</envar> is defined, <replaceable>libdir</replaceable> is 
     <filename>$GTK_EXE_PREFIX/lib</filename>. Otherwise it is the libdir
-    specified when GTK+ was configured, usually 
-    <filename>/usr/local/lib</filename>.) 
-    For each directory in the list, GTK+ actually looks first in 
-    a subdirectory named after the version number of GTK+, then in the 
-    directory itself and finally in the system-specific library path.
+    specified when GTK+ was configured, usually
+    <filename>/usr/lib</filename>, or
+    <filename>/usr/local/lib</filename>.)
+    For each directory in this list, GTK+ actually looks in a
+    subdirectory
+    <filename><replaceable>directory</replaceable>/<replaceable>version</replaceable>/<replaceable>host</replaceable>/<replaceable>type</replaceable></filename>
+    Where <replaceable>version</replaceable> is derived from the
+    version of GTK+ (use <literal>pkg-config
+    --variable=gtk_binary_version gtk+-2.0</literal> to determine this from a
+    script), <replaceable>host</replaceable> is the architecture on
+    which GTK+ was built. (use <literal>pkg-config
+    --variable=gtk_host gtk+-2.0</literal> to determine this from a
+    script), and <replaceable>type</replaceable> is a directory
+    specific to the type of modules; currently it can be
+    <literal>modules</literal>, <literal>engines</literal> or
+    <literal>immodules</literal> corresponding to the three types of
+    modules above. Either <replaceable>version</replaceable>,
+    <replaceable>host</replaceable>, or both may be omitted. GTK+ looks
+    first in the most specific directory, then in directories with
+    fewer components.
+    The components of GTK_PATH are separated by the ':' character on
+    Linux and Unix, and the ';' character on Windows.
   </para>
 </formalpara>
 
@@ -229,19 +253,6 @@ or <envar>DISPLAY</envar>; mostly to determine paths to look for certain files.
   </para>
 </formalpara>
 
-<formalpara id="im-module-path">
-  <title><envar>GTK_IM_MODULE_PATH</envar></title>
-
-  <para>
-    Specifies the path where GTK+ looks for IM modules. This environment 
-    variable overwrites the <literal>im_module_path</literal> specified in the 
-    RC files, which in turn overwrites the default
-    value <filename>$lt;libdir$gt;/gtk-2.0/immodules/&lt;version&gt;</filename>
-    (where &lt;version&gt; is the GTK+ version, and &lt;libdir&gt; is as 
-    explained above).
-  </para>
-</formalpara>
 <formalpara id="im-module-file">
   <title><envar>GTK_IM_MODULE_FILE</envar></title>
 
@@ -249,8 +260,8 @@ or <envar>DISPLAY</envar>; mostly to determine paths to look for certain files.
     Specifies the file listing the IM modules to load. This environment
     variable overwrites the <literal>im_module_file</literal> specified in 
     the RC files, which in turn overwrites the default value 
-    <filename>&lt;sysconfdir&gt;/gtk-2.0/gtk.immodules</filename>
-    (&lt;sysconfdir&gt; is the sysconfdir specified when GTK+ was configured, 
+    <filename><replaceable>sysconfdir</replaceable>/gtk-2.0/gtk.immodules</filename>
+    (<replaceable>sysconfdir</replaceable> is the sysconfdir specified when GTK+ was configured, 
      usually <filename>/usr/local/etc</filename>.)
   </para>
 </formalpara>
@@ -294,7 +305,7 @@ nevertheless.
   <para>
     Specifies the directory to look for GdkPixbuf loader modules. 
     By default, GdkPixbuf looks for its loaders in 
-    <filename>&lt;libdir&gt;/gtk-2.0/&lt;version&gt;/loaders</filename>.
+    <filename><replaceable>libdir</replaceable>/gtk-2.0/<replaceable>version</replaceable>/loaders</filename>.
   </para>
  </formalpara>
 
index 58596be8332025a793d2473d55aadafc3045e488..29bcfbdbf915ac5e9b0ad2b2e556cff38b956d7b 100644 (file)
@@ -776,12 +776,10 @@ that was expected but not found.
 
 <!-- ##### FUNCTION gtk_rc_find_module_in_path ##### -->
 <para>
-Looks up a file in the current module path.
 </para>
 
 @module_file: The name of the module to search for.
-@Returns: The filename, if found (must be freed with g_free()),
-otherwise %NULL.
+@Returns: 
 
 
 <!-- ##### FUNCTION gtk_rc_find_pixmap_in_path ##### -->
index 97bd6e649b62adf9bb8e4d30d16f3b7dae4647aa..8cfa00af80f502e5d1862dc84cbba1c1f2b81336 100644 (file)
@@ -5,6 +5,7 @@ includedir=@includedir@
 target=@gdktarget@
 
 gtk_binary_version=@GTK_BINARY_VERSION@
+gtk_host=@host@
 
 Name: GTK+
 Description: GIMP Tool Kit (${target} target)
index f7c3145ced18e4fa26702252a471beccffb26540..57701300fd795e66c4668eacf75508b92e0f3e81 100644 (file)
@@ -10,6 +10,7 @@ INCLUDES = @STRIP_BEGIN@ \
        -DGTK_LOCALEDIR=\"$(gtklocaledir)\"             \
        -DGTK_VERSION=\"@GTK_VERSION@\"                 \
        -DGTK_BINARY_VERSION=\"@GTK_BINARY_VERSION@\"   \
+       -DGTK_HOST=\"@host@\"                           \
        -DGTK_COMPILATION                               \
        -I$(top_builddir)/gtk                           \
        -I$(top_srcdir) -I../gdk                        \
index a6d5c1975adc4efd2c9558ced41e95ea8e509079..2c3f202173fa58e98ebd98c18e952eef65c9eb37 100644 (file)
@@ -282,73 +282,158 @@ _gtk_get_data_prefix (void)
 static gchar **
 get_module_path (void)
 {
-  const gchar *module_path_env = g_getenv ("GTK_MODULE_PATH");
-  const gchar *exe_prefix = g_getenv ("GTK_EXE_PREFIX");
-  gchar **result;
+  const gchar *module_path_env;
+  const gchar *exe_prefix;
+  const gchar *home_dir;
+  gchar *home_gtk_dir = NULL;
   gchar *module_path;
   gchar *default_dir;
+  static gchar **result = NULL;
+
+  if (result)
+    return result;
+
+  home_dir = g_get_home_dir();
+  if (home_dir)
+    home_gtk_dir = g_build_filename (home_dir, ".gtk-2.0", NULL);
+
+  module_path_env = g_getenv ("GTK_PATH");
+  exe_prefix = g_getenv ("GTK_EXE_PREFIX");
 
   if (exe_prefix)
-    default_dir = g_build_filename (exe_prefix, "lib", "gtk-2.0", "modules", NULL);
+    default_dir = g_build_filename (exe_prefix, "lib", "gtk-2.0", NULL);
   else
-    default_dir = g_build_filename (GTK_LIBDIR, "gtk-2.0", "modules", NULL);
+    default_dir = g_build_filename (GTK_LIBDIR, "gtk-2.0", NULL);
+
+  if (module_path_env && home_gtk_dir)
+    module_path = g_build_path (G_SEARCHPATH_SEPARATOR_S,
+                               module_path_env, home_gtk_dir, default_dir, NULL);
+  else if (module_path_env)
+    module_path = g_build_path (G_SEARCHPATH_SEPARATOR_S,
+                               module_path_env, default_dir, NULL);
+  else if (home_gtk_dir)
+    module_path = g_build_path (G_SEARCHPATH_SEPARATOR_S,
+                               home_gtk_dir, default_dir, NULL);
+  else
+    module_path = g_build_path (G_SEARCHPATH_SEPARATOR_S,
+                               default_dir, NULL);
 
-  module_path = g_strconcat (module_path_env ? module_path_env : "",
-                            module_path_env ? G_SEARCHPATH_SEPARATOR_S : "",
-                            default_dir, NULL);
+  g_free (home_gtk_dir);
+  g_free (default_dir);
 
   result = pango_split_file_list (module_path);
-
-  g_free (default_dir);
   g_free (module_path);
 
   return result;
 }
 
-static GModule *
-find_module (gchar      **module_path,
-            const gchar *name)
+/**
+ * _gtk_get_module_path:
+ * @type: the type of the module, for instance 'modules', 'engines', immodules'
+ * 
+ * Determines the search path for a particular type of module.
+ * 
+ * Return value: the search path for the module type. Free with g_strfreev().
+ **/
+gchar **
+_gtk_get_module_path (const gchar *type)
 {
-  GModule *module;
-  gchar *module_name;
-  gint i;
+  gchar **paths = get_module_path();
+  gchar **path;
+  gchar **result;
+  gint count = 0;
 
-  if (g_path_is_absolute (name))
-    return g_module_open (name, G_MODULE_BIND_LAZY);
+  for (path = paths; *path; path++)
+    count++;
 
-  for (i = 0; module_path[i]; i++)
-    {
-      gchar *version_directory;
+  result = g_new (gchar *, count * 4 + 1);
 
-      version_directory = g_build_filename (module_path[i], GTK_BINARY_VERSION, NULL);
-      module_name = g_module_build_path (version_directory, name);
-      g_free (version_directory);
-      
-      if (g_file_test (module_name, G_FILE_TEST_EXISTS))
-       {
-         module = g_module_open (module_name, G_MODULE_BIND_LAZY);
-         g_free (module_name);
-         return module;
-       }
+  count = 0;
+  for (path = get_module_path (); *path; path++)
+    {
+      gint use_version, use_host;
       
-      g_free (module_name);
+      for (use_version = TRUE; use_version >= FALSE; use_version--)
+       for (use_host = TRUE; use_host >= FALSE; use_host--)
+         {
+           gchar *tmp_dir;
+           
+           if (use_version && use_host)
+             tmp_dir = g_build_filename (*path, GTK_BINARY_VERSION, GTK_HOST, type, NULL);
+           else if (use_version)
+             tmp_dir = g_build_filename (*path, GTK_BINARY_VERSION, type, NULL);
+           else if (use_host)
+             tmp_dir = g_build_filename (*path, GTK_HOST, type, NULL);
+           else
+             tmp_dir = g_build_filename (*path, type, NULL);
+
+           result[count++] = tmp_dir;
+         }
+    }
 
-      module_name = g_module_build_path (module_path[i], name);
-      
-      if (g_file_test (module_name, G_FILE_TEST_EXISTS))
+  result[count++] = NULL;
+
+  return result;
+}
+
+/**
+ * _gtk_find_module:
+ * @name: the name of the module
+ * @type: the type of the module, for instance 'modules', 'engines', immodules'
+ * 
+ * Looks for a dynamically module named @name of type @type in the standard GTK+
+ *  module search path.
+ * 
+ * Return value: the pathname to the found module, or %NULL if it wasn't found.
+ *  Free with g_free().
+ **/
+gchar *
+_gtk_find_module (const gchar *name,
+                 const gchar *type)
+{
+  gchar **paths;
+  gchar **path;
+  gchar *module_name = NULL;
+
+  if (g_path_is_absolute (name))
+    return g_strdup (name);
+
+  paths = _gtk_get_module_path (type);
+  for (path = paths; *path; path++)
+    {
+      gchar *tmp_name = g_module_build_path (*path, name);
+           
+      if (g_file_test (tmp_name, G_FILE_TEST_EXISTS))
        {
-         module = g_module_open (module_name, G_MODULE_BIND_LAZY);
-         g_free (module_name);
-         return module;
+         module_name = tmp_name;
+         goto found;
        }
-
-      g_free (module_name);
+      else
+       g_free(tmp_name);
     }
 
-  /* As last resort, try loading without an absolute path (using system
-   * library path)
-   */
-  module_name = g_module_build_path (NULL, name);
+  g_strfreev (paths);
+
+ found:
+  return module_name;
+}
+
+static GModule *
+find_module (gchar      **module_path,
+            const gchar *name)
+{
+  GModule *module;
+  gchar *module_name;
+
+  module_name = _gtk_find_module (name, "modules");
+  if (!module_name)
+    {
+      /* As last resort, try loading without an absolute path (using system
+       * library path)
+       */
+      module_name = g_module_build_path (NULL, name);
+    }
+  
   module = g_module_open (module_name, G_MODULE_BIND_LAZY);
   g_free(module_name);
 
index 97b24b98aee484729d1ba243705450f473255c2a..1f010d4943bd23301a534dcadb9fab91bcbbe959 100644 (file)
@@ -204,6 +204,9 @@ gboolean _gtk_boolean_handled_accumulator (GSignalInvocationHint *ihint,
                                    const GValue          *handler_return,
                                    gpointer               dummy);
 
+gchar * _gtk_find_module     (const gchar *name,
+                             const gchar *type);
+gchar **_gtk_get_module_path (const gchar *type);
 
 #ifdef __cplusplus
 }
index 8d3d7ec1870e1f4798a07bc61ba5655b4f2540ee..1aa56683a0cd0a52ff739ff512639e1e0f9fa309 100644 (file)
@@ -52,6 +52,7 @@
 #include "gtkthemes.h"
 #include "gtkintl.h"
 #include "gtkiconfactory.h"
+#include "gtkmain.h"
 #include "gtkprivate.h"
 #include "gtksettings.h"
 #include "gtkwindow.h"
@@ -166,8 +167,6 @@ static void        gtk_rc_parse_pixmap_path_string   (GtkRcContext    *context,
                                                      GScanner        *scanner,
                                                      const gchar     *pix_path);
 static guint       gtk_rc_parse_module_path          (GScanner        *scanner);
-static void        gtk_rc_parse_module_path_string   (const gchar     *mod_path);
-static guint       gtk_rc_parse_im_module_path       (GScanner        *scanner);
 static guint       gtk_rc_parse_im_module_file       (GScanner        *scanner);
 static guint       gtk_rc_parse_path_pattern         (GtkRcContext    *context,
                                                      GScanner        *scanner);
@@ -179,7 +178,6 @@ static void        gtk_rc_clear_hash_node            (gpointer         key,
                                                       gpointer         data,
                                                       gpointer         user_data);
 static void        gtk_rc_clear_styles               (GtkRcContext    *context);
-static void        gtk_rc_append_default_module_path (void);
 static void        gtk_rc_add_initial_default_files  (void);
 
 static void        gtk_rc_style_init                 (GtkRcStyle      *style);
@@ -272,7 +270,6 @@ static const struct
   { "engine", GTK_RC_TOKEN_ENGINE },
   { "module_path", GTK_RC_TOKEN_MODULE_PATH },
   { "stock", GTK_RC_TOKEN_STOCK },
-  { "im_module_path", GTK_RC_TOKEN_IM_MODULE_PATH },
   { "im_module_file", GTK_RC_TOKEN_IM_MODULE_FILE },
   { "LTR", GTK_RC_TOKEN_LTR },
   { "RTL", GTK_RC_TOKEN_RTL }
@@ -280,15 +277,11 @@ static const struct
 
 static GHashTable *realized_style_ht = NULL;
 
-static gchar *im_module_path = NULL;
 static gchar *im_module_file = NULL;
 
 #define GTK_RC_MAX_DEFAULT_FILES 128
 static gchar *gtk_rc_default_files[GTK_RC_MAX_DEFAULT_FILES];
 
-#define GTK_RC_MAX_MODULE_PATHS 128
-static gchar *module_path[GTK_RC_MAX_MODULE_PATHS];
-
 /* A stack of directories for RC files we are parsing currently.
  * these are implicitely added to the end of PIXMAP_PATHS
  */
@@ -317,29 +310,25 @@ gtk_rc_make_default_dir (const gchar *type)
  *    look for IM modules.
  *
  * Obtains the path in which to look for IM modules. See the documentation
- * of the <link linkend="im-module-path"><envar>GTK_IM_MODULE_PATH</envar></link>
- * environment variable for more details.
+ * of the <link linkend="im-module-path"><envar>GTK_PATH</envar></link>
+ * environment variable for more details about looking up modules. This
+ * function is useful solely for utilities supplied with GTK+ and should
+ * not be used by applications under normal circumstances.
  */
 gchar *
 gtk_rc_get_im_module_path (void)
 {
-  const gchar *result = g_getenv ("GTK_IM_MODULE_PATH");
+  gchar **paths = _gtk_get_module_path ("immodules");
+  gchar *result = g_strjoinv (G_SEARCHPATH_SEPARATOR_S, paths);
+  g_strfreev (paths);
 
-  if (!result)
-    {
-      if (im_module_path)
-       result = im_module_path;
-      else
-       return gtk_rc_make_default_dir ("immodules");
-    }
-
-  return g_strdup (result);
+  return result;
 }
 
 /**
  * gtk_rc_get_im_module_file:
  * @returns: a newly-allocated string containing the name of the file
- * listing the IM modules to load
+ * listing the IM modules available for loading
  *
  * Obtains the path to the IM modules file. See the documentation
  * of the <link linkend="im-module-file"><envar>GTK_IM_MODULE_FILE</envar></link>
@@ -382,33 +371,6 @@ gtk_rc_get_module_dir (void)
   return gtk_rc_make_default_dir ("engines");
 }
 
-static void
-gtk_rc_append_default_module_path (void)
-{
-  const gchar *var;
-  gchar *path;
-  gint n;
-
-  for (n = 0; module_path[n]; n++) ;
-  if (n >= GTK_RC_MAX_MODULE_PATHS - 1)
-    return;
-  
-  var = g_getenv ("GTK_EXE_PREFIX");
-  if (var)
-    path = g_build_filename (var, "lib", "gtk-2.0", GTK_VERSION, "engines", NULL);
-  else
-    path = g_build_filename (GTK_LIBDIR, "gtk-2.0", GTK_VERSION, "engines", NULL);
-  module_path[n++] = path;
-
-  var = g_get_home_dir ();
-  if (var)
-    {
-      path = g_build_filename (var, ".gtk-2.0", GTK_VERSION, "engines", NULL);
-      module_path[n++] = path;
-    }
-  module_path[n] = NULL;
-}
-
 static void
 gtk_rc_add_initial_default_files (void)
 {
@@ -655,9 +617,6 @@ _gtk_rc_init (void)
     {
       initialized = TRUE;
       
-      module_path[0] = NULL;
-      gtk_rc_append_default_module_path();
-      
       gtk_rc_add_initial_default_files ();
     }
   
@@ -2265,9 +2224,6 @@ gtk_rc_parse_statement (GtkRcContext *context,
     case GTK_RC_TOKEN_MODULE_PATH:
       return gtk_rc_parse_module_path (scanner);
       
-    case GTK_RC_TOKEN_IM_MODULE_PATH:
-      return gtk_rc_parse_im_module_path (scanner);
-      
     case GTK_RC_TOKEN_IM_MODULE_FILE:
       return gtk_rc_parse_im_module_file (scanner);
 
@@ -2873,28 +2829,20 @@ gtk_rc_find_pixmap_in_path (GtkSettings  *settings,
   return NULL;
 }
 
+/**
+ * gtk_rc_find_module_in_path:
+ * @module_file: name of a theme engine
+ * 
+ * Searches for a theme engine in the GTK+ search path. This function
+ * is not useful for applications and should not be used.
+ * 
+ * Return value: The filename, if found (must be freed with g_free()),
+ *   otherwise %NULL.
+ **/
 gchar*
 gtk_rc_find_module_in_path (const gchar *module_file)
 {
-  gint i;
-  gint fd;
-  gchar *buf;
-  
-  for (i = 0; (i < GTK_RC_MAX_MODULE_PATHS) && (module_path[i] != NULL); i++)
-    {
-      buf = g_build_filename (module_path[i], module_file, NULL);
-      
-      fd = open (buf, O_RDONLY);
-      if (fd >= 0)
-       {
-         close (fd);
-         return buf;
-       }
-      
-      g_free (buf);
-    }
-    
-  return NULL;
+  return _gtk_find_module (module_file, "engines");
 }
 
 static guint
@@ -3328,30 +3276,9 @@ gtk_rc_parse_module_path (GScanner *scanner)
   token = g_scanner_get_next_token (scanner);
   if (token != G_TOKEN_STRING)
     return G_TOKEN_STRING;
-  
-  gtk_rc_parse_module_path_string (scanner->value.v_string);
-  
-  return G_TOKEN_NONE;
-}
 
-static guint
-gtk_rc_parse_im_module_path (GScanner *scanner)
-{
-  guint token;
+  g_warning ("module_path directive is now ignored\n");
   
-  token = g_scanner_get_next_token (scanner);
-  if (token != GTK_RC_TOKEN_IM_MODULE_FILE)
-    return GTK_RC_TOKEN_IM_MODULE_FILE;
-  
-  token = g_scanner_get_next_token (scanner);
-  if (token != G_TOKEN_STRING)
-    return G_TOKEN_STRING;
-
-  if (im_module_path)
-    g_free (im_module_path);
-    
-  im_module_path = g_strdup (scanner->value.v_string);
-
   return G_TOKEN_NONE;
 }
 
@@ -3376,39 +3303,6 @@ gtk_rc_parse_im_module_file (GScanner *scanner)
   return G_TOKEN_NONE;
 }
 
-static void
-gtk_rc_parse_module_path_string (const gchar *mod_path)
-{
-  gint end_offset;
-  gint start_offset = 0;
-  gint path_len;
-  gint path_num;
-  
-  /* free the old one, or just add to the old one ? */
-  for (path_num=0; module_path[path_num]; path_num++)
-    {
-      g_free (module_path[path_num]);
-      module_path[path_num] = NULL;
-    }
-  
-  path_num = 0;
-  
-  path_len = strlen (mod_path);
-  
-  for (end_offset = 0; end_offset <= path_len; end_offset++)
-    {
-      if ((mod_path[end_offset] == G_SEARCHPATH_SEPARATOR) ||
-         (end_offset == path_len))
-       {
-         module_path[path_num] = g_strndup (mod_path + start_offset, end_offset - start_offset);
-         path_num++;
-         module_path[path_num] = NULL;
-         start_offset = end_offset + 1;
-       }
-    }
-  gtk_rc_append_default_module_path();
-}
-
 static guint
 gtk_rc_parse_path_pattern (GtkRcContext *context,
                           GScanner     *scanner)